"""Fallback service for AI generation failures."""
import logging
import random
from typing import Optional, Dict
from app.models.poi import POI
from app.models.weather_data import WeatherData

logger = logging.getLogger(__name__)


class FallbackService:
    """Service providing fallback content when AI generation fails."""
    
    # POI introduction templates by category
    INTRODUCTION_TEMPLATES = {
        '风景名胜': [
            '{name}是一处著名的风景名胜，以其独特的自然景观和人文历史而闻名。这里四季景色各异，每个季节都有不同的美景等待您的发现。',
            '欢迎来到{name}。这里是一个充满魅力的景点，拥有丰富的历史文化底蕴。漫步其中，您可以感受到大自然的鬼斧神工和历史的厚重感。',
            '{name}是当地的标志性景点之一。这里不仅风景优美，还承载着深厚的文化内涵。无论是摄影爱好者还是历史文化爱好者，都能在这里找到乐趣。'
        ],
        '公园': [
            '{name}是一个适合休闲散步的好地方。公园内绿树成荫，空气清新，是城市中难得的一片绿洲。在这里，您可以放松身心，享受宁静的时光。',
            '欢迎来到{name}。这座公园为市民提供了一个亲近自然的好去处。无论是晨练、散步还是休憩，这里都是理想的选择。',
            '{name}是一个充满生机的城市公园。园内设施完善，景色宜人，是家庭出游和朋友聚会的好地方。'
        ],
        '广场': [
            '{name}是当地重要的公共活动空间。这里经常举办各种文化活动和庆典，是市民休闲娱乐的热门场所。',
            '欢迎来到{name}。这个广场见证了城市的发展变迁，是市民生活的重要组成部分。在这里，您可以感受到城市的活力和人文气息。',
            '{name}是一个开阔的城市广场，周边设施齐全，交通便利。无论白天还是夜晚，这里都充满了生机与活力。'
        ],
        '博物馆': [
            '{name}收藏了丰富的文物和艺术品，是了解当地历史文化的重要窗口。馆内展品精美，值得细细品味。',
            '欢迎参观{name}。这里通过珍贵的展品和详实的资料，向您展示了悠久的历史和灿烂的文化。',
            '{name}是一座重要的文化机构，致力于保护和传承历史文化遗产。参观这里，您将获得丰富的知识和独特的体验。'
        ],
        '纪念馆': [
            '{name}是为纪念重要历史事件或人物而建立的。这里通过展览和文献，让我们铭记历史，缅怀先贤。',
            '欢迎来到{name}。这座纪念馆承载着重要的历史记忆，是进行爱国主义教育和历史学习的重要场所。',
            '{name}通过丰富的史料和展品，向我们讲述了那段不应被忘却的历史。参观这里，让我们更加珍惜今天的美好生活。'
        ],
        '其他': [
            '{name}是一个值得一游的地方。这里有着独特的魅力，等待您来探索和发现。',
            '欢迎来到{name}。这里是一个有趣的景点，相信您会在这里度过愉快的时光。',
            '{name}是当地的一个特色景点。来到这里，您可以体验到不一样的风景和文化。'
        ]
    }
    
    # Weather-based introduction additions
    WEATHER_ADDITIONS = {
        '晴': '今天天气晴朗，阳光明媚，正是游览的好时机。',
        '多云': '今天云层较多，气候宜人，适合户外活动。',
        '阴': '今天天气阴沉，但气温适中，依然适合散步游览。',
        '雨': '今天有雨，建议您注意防雨，雨中的景色别有一番风味。',
        '雪': '今天飘着雪花，银装素裹的景色格外迷人。',
    }
    
    # Preset music library (placeholder URLs - in production, these would be actual audio files)
    PRESET_MUSIC = {
        'relaxing': {
            'name': '轻松散步曲',
            'description': '轻松愉快的背景音乐，适合悠闲散步',
            'url': '/static/music/preset/relaxing.mp3',
            'duration': 180
        },
        'nature': {
            'name': '自然之声',
            'description': '融合自然元素的舒缓音乐',
            'url': '/static/music/preset/nature.mp3',
            'duration': 200
        },
        'classical': {
            'name': '古典雅韵',
            'description': '优雅的古典音乐，适合文化景点',
            'url': '/static/music/preset/classical.mp3',
            'duration': 220
        },
        'upbeat': {
            'name': '活力节奏',
            'description': '充满活力的轻快音乐',
            'url': '/static/music/preset/upbeat.mp3',
            'duration': 190
        },
        'peaceful': {
            'name': '宁静时光',
            'description': '平和宁静的音乐，适合公园散步',
            'url': '/static/music/preset/peaceful.mp3',
            'duration': 210
        }
    }
    
    def __init__(self):
        """Initialize fallback service."""
        pass
    
    def generate_poi_introduction_fallback(
        self,
        poi: POI,
        context: Optional[Dict] = None
    ) -> str:
        """Generate POI introduction using templates.
        
        Args:
            poi: POI to introduce
            context: Context including weather, time, etc.
            
        Returns:
            Generated introduction text
        """
        logger.info(f"Using fallback template for POI introduction: {poi.name}")
        
        # Get category-specific templates
        category = self._normalize_category(poi.category)
        templates = self.INTRODUCTION_TEMPLATES.get(category, self.INTRODUCTION_TEMPLATES['其他'])
        
        # Select random template
        template = random.choice(templates)
        
        # Fill in POI name
        introduction = template.format(name=poi.name)
        
        # Add weather context if available
        if context and context.get('weather'):
            weather = context['weather']
            weather_condition = weather.get('condition', '')
            
            # Find matching weather addition
            for key, addition in self.WEATHER_ADDITIONS.items():
                if key in weather_condition:
                    introduction += ' ' + addition
                    break
        
        logger.info(f"Generated fallback introduction: {introduction[:50]}...")
        return introduction
    
    def get_preset_music(
        self,
        poi: POI,
        weather: Optional[WeatherData] = None,
        mood: Optional[str] = None
    ) -> Dict:
        """Get preset music based on context.
        
        Args:
            poi: POI context
            weather: Weather context
            mood: Mood/atmosphere
            
        Returns:
            Preset music information
        """
        logger.info(f"Using preset music for POI: {poi.name}")
        
        # Select music based on POI category
        category = self._normalize_category(poi.category)
        
        if '博物馆' in category or '纪念馆' in category or '历史' in category:
            music_key = 'classical'
        elif '公园' in category or '自然' in category:
            music_key = 'nature'
        elif '广场' in category:
            music_key = 'upbeat'
        else:
            music_key = 'peaceful'
        
        # Adjust based on weather if available
        if weather:
            if '雨' in weather.condition or '雪' in weather.condition:
                music_key = 'peaceful'
            elif '晴' in weather.condition:
                music_key = 'upbeat'
        
        music_info = self.PRESET_MUSIC[music_key].copy()
        logger.info(f"Selected preset music: {music_info['name']}")
        
        return music_info
    
    def _normalize_category(self, category: str) -> str:
        """Normalize POI category for template matching.
        
        Args:
            category: Original category string
            
        Returns:
            Normalized category
        """
        category_lower = category.lower()
        
        # Map various category names to standard categories
        if '风景' in category or '名胜' in category or '景区' in category:
            return '风景名胜'
        elif '公园' in category:
            return '公园'
        elif '广场' in category:
            return '广场'
        elif '博物馆' in category:
            return '博物馆'
        elif '纪念' in category:
            return '纪念馆'
        else:
            return '其他'
    
    def log_failure(
        self,
        service: str,
        error: Exception,
        context: Optional[Dict] = None
    ):
        """Log AI generation failure for monitoring.
        
        Args:
            service: Service name (e.g., 'poi_introduction', 'music_generation')
            error: Exception that occurred
            context: Additional context information
        """
        log_message = f"AI generation failure - Service: {service}, Error: {str(error)}"
        
        if context:
            log_message += f", Context: {context}"
        
        logger.error(log_message)
        
        # In production, this could also:
        # - Send to error tracking service (e.g., Sentry)
        # - Store in database for analysis
        # - Trigger alerts if failure rate is high
